package com.oa.controller;

//import jakarta.servlet.ServletContext;
//import jakarta.servlet.http.HttpSession;
//import org.json.HTTP;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

@RestController
@CrossOrigin
public class FileController {

    //文件上传路径
//    private static final String filePath = System.getProperty("user.dir")+"/files/";

    //下载文件
    @RequestMapping("/testDown")
    public ResponseEntity<byte[]> testResponseEntity(javax.servlet.http.HttpSession session) throws
            IOException {
        //获取ServletContext对象
        javax.servlet.ServletContext servletContext = session.getServletContext();
        //获取服务器中文件的真实路径
//        String realPath = servletContext.getRealPath("/static/img/1.jpg");
        String realPath = servletContext.getRealPath("/img/佳奈2.jpg");
        System.out.println("*********************" + realPath);
        //创建输入流
        InputStream is = new FileInputStream(realPath);
        //创建字节数组
        byte[] bytes = new byte[is.available()];
        //将流读到字节数组中
        is.read(bytes);
        //创建HttpHeaders对象设置响应头信息
        MultiValueMap<String, String> headers = new HttpHeaders();
        //设置要下载方式以及下载文件的名字
        headers.add("Content-Disposition", "attachment;filename=1.jpg");
        //设置响应状态码
        HttpStatus statusCode = HttpStatus.OK;
        //创建ResponseEntity对象
        ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers,
                statusCode);
        //关闭输入流
        is.close();
        return responseEntity;
    }


    //文件上传
    @RequestMapping("/testUp")
    public String testUp(@RequestParam("photo") MultipartFile files, javax.servlet.http.HttpSession session) throws IOException {
        //获取上传的文件名
        String fileName = files.getOriginalFilename();
        //处理文件重名的问题
        //这个是拿到了.之前的文件名
//        String hzName = fileName.substring(0, fileName.lastIndexOf(".") );
        //拿到后缀名
        String fileExtension = "";
        if (fileName != null && fileName.contains(".")) {
            fileExtension = fileName.substring(fileName.lastIndexOf(".") + 1);
        }
        String newFileName = UUID.randomUUID().toString() + fileExtension;
//        使用session.getServletContext().getRealPath("/photo")
//        来获取文件上传路径会将文件上传到当前运行环境的文件系统路径中，而不是项目的源代码目录。
//        具体来说，这个方法会将文件上传到target目录下的photo文件夹中。
        String path = session.getServletContext().getRealPath("/photo");

        //创建文件
        File file = new File(path);
        //判断文件是否存在
        if (!file.exists()) {
            file.mkdir();//新创建目录
        }
        //拼接完整的上传路径  在 Windows 系统中，File.separator 的值为 \。
        String filePath = path + File.separator + newFileName;
        //上传
        files.transferTo(new File(filePath));
        return "success";
    }


    /**
     * 文件上传的封装方法
     *
     * @param files          MultipartFile参数名
     * @param uploadUrl      上传文件夹路径
     * @param servletContext 文件真实路径
     * @return
     * @throws IOException
     */
    public String uploadFiles(MultipartFile files, String uploadUrl, javax.servlet.ServletContext servletContext) throws IOException {
        //获取上传的文件名
        String fileName = files.getOriginalFilename();
        //处理文件重名的问题
        //拿到前缀名
        String qianzhuiName = fileName.substring(0, fileName.lastIndexOf("."));
        //拿到后缀名
        String hzName = "";
        if (fileName != null && fileName.contains(".")) {
            hzName = fileName.substring(fileName.lastIndexOf(".") + 1);
        }
        String newFileName = qianzhuiName + "." + hzName;
//        String newFileName =  fileName;
//        使用session.getServletContext().getRealPath("/photo")
//        来获取文件上传路径会将文件上传到当前运行环境的文件系统路径中，而不是项目的源代码目录。
//        具体来说，这个方法会将文件上传到target目录下的photo文件夹中。
        String path = servletContext.getRealPath("/" + uploadUrl);
        //创建文件
        File file = new File(path);
        //判断文件是否存在
        if (!file.exists()) {
            file.mkdir();//新创建目录
        }
        //拼接完整的上传路径
        String filePath = path + File.separator + newFileName;
        //上传
        files.transferTo(new File(filePath));

        return newFileName;
    }


//    /**
//     * 文件上传
//     */
//    @PostMapping("/upload")
//    public void upload(MultipartFile file) {
//        synchronized (FileController.class) {
//            String flag = System.currentTimeMillis()+"";
//            String fileName = file.getOriginalFilename();
//            try{
//                if (!FileUtil.isDirectory(filePath) ) {
//                    FileUtil.mkdir(filePath);
//                }
//                //文件存储形式：时间戳-文件名
//                FileUtil.writeBytes(file.getBytes(),filePath + flag + "-" + fileName);
//                System.out.println(fileName + "- -上传成功");
//                Thread.sleep();
//            } catch (Exception e) {
//                System.err.println(fileName + "--文件上传失败");
//            }
//        }
//    }


    /**
     * 文件上传
     * @param files
     * @return
     */
    @PostMapping("/upload")
    public Map<String, Object> upload(@RequestParam("photo") MultipartFile files) {
        Map<String, Object> resmap = new HashMap<>();
        String filePath = System.getProperty("user.dir") + File.separator + "files";
//        D:\前E盘备份\bdqnS3Project\vue_study\emp-bg\files\
//        String filePath = System.getProperty("user.dir") + File.separator + "files";

        // 输出带有双斜杠的路径
//        System.out.println("文件路径: " + filePath.replace("\\", "\\\\"));
        try {
            // 获取上传的文件名
            String fileName = files.getOriginalFilename();
            if (fileName == null || fileName.isEmpty()) {
                resmap.put("success", false);
                resmap.put("error", "文件名为空");
                return resmap;
            }

            // 处理文件名
            String newFileName = fileName; // 这里可以根据需求处理文件名
            // filePath.replace("\\", "\\\\")  输出带有双斜杠的路径
            // "D:\\前E盘备份\\bdqnS3Project\\vue_study\\emp-bg\\files\\"
            File directory = new File(filePath.replace("\\", "\\\\"));
            if (!directory.exists()) {
                directory.mkdirs();  // 创建目录
            }

            // 拼接完整的上传路径      getAbsolutePath(): 用于获取文件或目录的绝对路径
            String newFilePath = new File(directory, newFileName).getAbsolutePath().replace("\\", "\\\\");
//            System.out.println(newFilePath);
            // 上传
            files.transferTo(new File(newFilePath));

            // 返回成功响应
            resmap.put("success", true);
            resmap.put("fileName", newFileName);
            return resmap;

        } catch (Exception e) {
            e.printStackTrace();
            resmap.put("success", false);
            resmap.put("error", "文件上传失败: " + e.getMessage());
            return resmap;
        }
    }



    // http://localhost:8888/fileDown/男漫.jpg
    // 下载文件
    @GetMapping("/fileDown/{fileName}")
    public ResponseEntity<byte[]> testResponseEntity(@PathVariable(value = "fileName") String fileName) throws IOException {
        String filePath = System.getProperty("user.dir") + File.separator + "files";
        File directory = new File(filePath.replace("\\", "\\\\"));

        String realPath = new File(directory, fileName).getAbsolutePath();
//        System.out.println("*********************" + realPath);

        // 创建输入流
        InputStream is = new FileInputStream(realPath);
        // 创建字节数组
        byte[] bytes = new byte[is.available()];
        // 将流读到字节数组中
        is.read(bytes);
        // 关闭输入流
        is.close();

        // 创建HttpHeaders对象设置响应头信息
        HttpHeaders headers = new HttpHeaders();
        // 设置要下载方式以及下载文件的名字，使用 URLEncoder 编码文件名
        String encodedFileName = URLEncoder.encode(fileName, "UTF-8");
        headers.add("Content-Disposition", "attachment; filename=\"" + encodedFileName + "\"");
        // 设置响应状态码
        HttpStatus statusCode = HttpStatus.OK;

        // 创建ResponseEntity对象
        return new ResponseEntity<>(bytes, headers, statusCode);
    }


    /**
     * wang-editor编辑器文件上传接口
     * @param files
     * @return
     */
    @RequestMapping("/wang/upload")
    public Map<String, Object> wangUpload(@RequestParam("photo") MultipartFile files) {
        Map<String, Object> resmap = new HashMap<>();
        String filePath = System.getProperty("user.dir") + File.separator + "files";
//        D:\前E盘备份\bdqnS3Project\vue_study\emp-bg\files\
//        String filePath = System.getProperty("user.dir") + File.separator + "files";

        // 输出带有双斜杠的路径
//        System.out.println("文件路径: " + filePath.replace("\\", "\\\\"));
            // 获取上传的文件名
            String fileName = files.getOriginalFilename();
            if (fileName == null || fileName.isEmpty()) {
                resmap.put("success", false);
                resmap.put("error", "文件名为空");
                return resmap;
            }

            // 处理文件名
            String newFileName = fileName; // 这里可以根据需求处理文件名
            // filePath.replace("\\", "\\\\")  输出带有双斜杠的路径
            // "D:\\前E盘备份\\bdqnS3Project\\vue_study\\emp-bg\\files\\"
            File directory = new File(filePath.replace("\\", "\\\\"));
            if (!directory.exists()) {
                directory.mkdirs();  // 创建目录
            }

            // 拼接完整的上传路径      getAbsolutePath(): 用于获取文件或目录的绝对路径
            String newFilePath = new File(directory, newFileName).getAbsolutePath().replace("\\", "\\\\");
//              System.out.println(newFilePath);
        try {
            // 上传
            files.transferTo(new File(newFilePath));
        }
            catch (Exception e) {
                System.err.println("文件上传失败");
            }

        // 构建返回的数据
            Map<String, Object> data = new HashMap<>();
            // 文件下载方法   http://localhost:8888/wang/upload
            String http = "http://localhost:8888/fileDown/";
            data.put("url", http+fileName); // 图片的 src
//        data.put("alt", alt != null ? alt : ""); // 图片描述文字，非必须
//        data.put("href", href != null ? href : ""); // 图片的链接，非必须
            // wangEditor上传图片成功后，需要返回的参数 （官方固定参数）
            resmap.put("errno", 0); // 表示上传成功
            resmap.put("data", data); // 返回的数据
            return resmap;
        }


    }



